package com.mazewei.dev.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * 年级提取服务
 * 负责从班级名称中提取年级信息和相关的格式转换
 */
@Service
public class GradeExtractionService {
    
    private static final Logger logger = LoggerFactory.getLogger(GradeExtractionService.class);
    
    /**
     * 从班级名称中提取年级信息用于智能匹配
     * @param className 班级名称
     * @return 年级信息（如"七上"、"八下"等）
     */
    public String extractGradeFromClassName(String className) {
        if (className == null || className.trim().isEmpty()) {
            return null;
        }
        
        // 提取年级标识
        String gradeIdentifier = extractGradeIdentifier(className);
        if (gradeIdentifier != null && gradeIdentifier.length() > 2) {
            // 去掉括号，返回如"七上"、"八下"的格式
            return gradeIdentifier.replace("（", "").replace("）", "").replace("(", "").replace(")", "");
        }
        
        return null;
    }
    
    /**
     * 提取年级标识符
     * @param className 班级名称
     * @return 年级标识符（如"（七上）"或"(一上)"）
     */
    public String extractGradeIdentifier(String className) {
        if (className == null || className.trim().isEmpty()) {
            return "（一上）"; // 默认返回小学一年级上学期
        }
        
        className = className.trim();
        logger.debug("[年级标识提取调试] 输入班级名称: {}", className);
        
        // 首先检查是否已经包含括号中的年级信息，但要确保不是数字后缀
        if (className.contains("（") && className.contains("）")) {
            int start = className.indexOf("（");
            int end = className.indexOf("）") + 1;
            if (start < end) {
                String gradeInfo = className.substring(start, end);
                // 如果包含的是数字（如（1）、（2）），则忽略，按照年级重新生成
                if (!gradeInfo.matches(".*（\\d+）.*")) {
                    return gradeInfo;
                }
            }
        }
        
        // 匹配常见的年级关键词，统一生成上学期后缀
        // 中学年级使用中文括号
        if (className.contains("九年") || className.startsWith("九（")) {
            return "（九上）";
        } else if (className.contains("八年") || className.startsWith("八（")) {
            return "（八上）";
        } else if (className.contains("七年") || className.startsWith("七（")) {
            return "（七上）";
        }
        // 小学年级使用中文括号（与数据库保持一致）
        else if (className.contains("六年") || className.startsWith("六（")) {
            return "（六上）";
        } else if (className.contains("五年") || className.startsWith("五（")) {
            return "（五上）";
        } else if (className.contains("四年") || className.startsWith("四（")) {
            return "（四上）";
        } else if (className.contains("三年") || className.startsWith("三（")) {
            return "（三上）";
        } else if (className.contains("二年") || className.startsWith("二（")) {
            return "（二上）";
        } else if (className.contains("一年") || className.startsWith("一（")) {
            logger.debug("[年级标识提取调试] 匹配到一年级，返回: （一上）");
            return "（一上）";
        }
        
        // 如果没有匹配到，默认返回小学一年级上学期
        logger.debug("[年级标识提取调试] 未匹配到年级，返回默认值: （一上）");
        return "（一上）";
    }
    
    /**
     * 提取年级数字
     * @param className 班级名称
     * @return 年级数字（如"1"、"2"等）
     */
    public String extractGradeNumber(String className) {
        if (className == null || className.trim().isEmpty()) {
            return "1"; // 默认返回1
        }
        
        className = className.trim();
        
        // 检查中学年级
        if (className.contains("九年") || className.startsWith("九（")) {
            return "9";
        } else if (className.contains("八年") || className.startsWith("八（")) {
            return "8";
        } else if (className.contains("七年") || className.startsWith("七（")) {
            return "7";
        }
        
        // 检查小学年级
        if (className.contains("六年") || className.startsWith("六（")) {
            return "6";
        } else if (className.contains("五年") || className.startsWith("五（")) {
            return "5";
        } else if (className.contains("四年") || className.startsWith("四（")) {
            return "4";
        } else if (className.contains("三年") || className.startsWith("三（")) {
            return "3";
        } else if (className.contains("二年") || className.startsWith("二（")) {
            return "2";
        } else if (className.contains("一年") || className.startsWith("一（")) {
            return "1";
        }
        
        // 如果都没有匹配到，默认返回1
        return "1";
    }
    
    /**
     * 将中文年级转换为数字年级
     * @param gradeIdentifier 年级标识符（如"（七上）"）
     * @return 数字年级（如"7"）
     */
    public String convertGradeToNumeric(String gradeIdentifier) {
        if (gradeIdentifier == null || gradeIdentifier.trim().isEmpty()) {
            return null;
        }
        
        String grade = gradeIdentifier.replace("（", "").replace("）", "").replace("(", "").replace(")", "");
        
        // 去掉"上"、"下"后缀
        grade = grade.replace("上", "").replace("下", "");
        
        switch (grade) {
            case "一":
                return "1";
            case "二":
                return "2";
            case "三":
                return "3";
            case "四":
                return "4";
            case "五":
                return "5";
            case "六":
                return "6";
            case "七":
                return "7";
            case "八":
                return "8";
            case "九":
                return "9";
            default:
                return null;
        }
    }
    
    /**
     * 将数字年级转换为中文年级
     * @param numericGrade 数字年级（如"7"）
     * @return 中文年级标识符（如"（七上）"）
     */
    public String convertNumericToGrade(String numericGrade) {
        if (numericGrade == null || numericGrade.trim().isEmpty()) {
            return "（一上）";
        }
        
        switch (numericGrade.trim()) {
            case "1":
                return "（一上）";
            case "2":
                return "（二上）";
            case "3":
                return "（三上）";
            case "4":
                return "（四上）";
            case "5":
                return "（五上）";
            case "6":
                return "（六上）";
            case "7":
                return "（七上）";
            case "8":
                return "（八上）";
            case "9":
                return "（九上）";
            default:
                return "（一上）";
        }
    }
    
    /**
     * 判断是否为小学年级
     * @param className 班级名称
     * @return 是否为小学年级
     */
    public boolean isPrimaryGrade(String className) {
        if (className == null || className.trim().isEmpty()) {
            return true; // 默认认为是小学
        }
        
        String gradeNumber = extractGradeNumber(className);
        int grade = Integer.parseInt(gradeNumber);
        return grade >= 1 && grade <= 6;
    }
    
    /**
     * 判断是否为中学年级
     * @param className 班级名称
     * @return 是否为中学年级
     */
    public boolean isMiddleGrade(String className) {
        if (className == null || className.trim().isEmpty()) {
            return false;
        }
        
        String gradeNumber = extractGradeNumber(className);
        int grade = Integer.parseInt(gradeNumber);
        return grade >= 7 && grade <= 9;
    }
    
    /**
     * 根据班级名称和年级确定学期后缀
     * @param className 班级名称
     * @param gradeNumber 年级数字
     * @return 学期后缀（固定返回"上"，因为本项目只有上学期）
     */
    private String determineSemester(String className, String gradeNumber) {
        // 本项目只有上学期，固定返回"上"
        return "上";
    }
}